package learnkotlin

import kotlin.jvm.JvmStatic

object KotlinDemo4 {
    @JvmStatic
    fun main(args: Array<String>) {


        //doStudy(null)//编译不过
        doStudy2(null)
    }

    /**
     * ==============================空指针检查
     * kotlin  默认参数和变量都不能为null
     * kotlin 将空指针异常检查提前到了编译时期
     */

    fun checkNullPoint1() {

    }

    fun doStudy(ss: Study) {
        ss.doHomeWork()
        ss.readBooks()
    }

    /**
     *  数据类型?  表示可以为空
     *  但使用时要做非空判断 不然编译不过
     */
    fun doStudy2(ss: Study?) {
        if (ss != null) {
            ss.doHomeWork()
            ss.readBooks()
        }

        /**
         * kotlin 提供  ?.  操作符 判空辅助工具  不为空才执行后面操作
         */
        ss?.doHomeWork()
        /**
         *   ?: 操作符  左边表达式的结果不为空就返回左边表达式的结果 ,否则就返回右边表达式的结果
         *   (左) ?: (右)  (左是否空)
         */

        val c = ss ?: "ss为空"
        println(c)

    }

    fun getTextLength(text: String?): Int {
        if (text != null) {
            return text.length
        }
        return 0;
    }

    fun getTextLength2(text: String?) = text?.length ?: 0  //text 为null  text?.length  为null


    class Study {

        fun doHomeWork() {
            println("doHomeWork")
        }

        fun readBooks() {
            println("readBooks")
        }
    }


    /**
     * ===================== let 函数 将原始调用对象作为参数传递到lambda表达式
     */
    fun doStudy3(ss: Study?) {
        ss?.let { s2 ->
            s2.doHomeWork()
            s2.readBooks()
        }
        //简化   let函数可以处理全局变量判空问题  不用 每次调用函数都 ?. 了
        ss?.let {
            it.doHomeWork()
            it.readBooks()
        }
    }
}